/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

/*
 * CustomerGUI.java
 *
 * Created on 28-11-2011, 11:02:51
 */
package GUILag;

import ControllerLag.CustomerCTR;
import ModelLag.Customer;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JOptionPane;
import javax.swing.JTextField;
import javax.swing.RowSorter;
import javax.swing.SortOrder;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableModel;
import javax.swing.table.TableRowSorter;

/**
 * GUI - Panel til styring af CRUD customer funktionaliteter.
 * @author DM75 Gruppe 3
 * @version 2011-12-22
 */
public class AdmCustomerPanel extends javax.swing.JPanel {
    
    private CustomerCTR customerCtr;

    /** Creates new form CustomerGUI */
    public AdmCustomerPanel() {
        initComponents();
        
        customerCtr = new CustomerCTR();
        
        // Indsætter data i tabellen i GUI.
        updateCustomerTable();
    }

    /**
     * Henter den model som bruges i netbeans GUI, så man kan sætte properties ved
     * at højreklikke på tabellen i IDE. Man slipper derved for at skrive det i koden
     * eller at skulle lave sin egen tablemodel.
     * @return Tablemodel som bruges.
     */
    private DefaultTableModel getModel()
    {
        return (DefaultTableModel) customerTable.getModel();
    }
    @SuppressWarnings("unchecked")
    /**
     * Bruges til at tilføje en række til modellen/tabellen. Derefter tilføjer den
     * det data som er med som parameter. Når der tilføjes noget til modellen, så
     * opdateres tabellen automatisk. 
     * @param phoneNo TelefonNr på customer.
     * @param fName Fornavn på customer.
     * @param lName Efternavn på customer.
     * @param address Adresse på customer.
     * @param zipCode PostNr på customer.
     * @param city By på customer.
     * @param email Email på customer.
     * @param sort Bestemmer om modellen skal sorteres i 0. kolonne.
     */
    private void addRowAndData(String phoneNo, String fName, String lName, String address, String zipCode, String city, String email, boolean sort)
    {
        Object[] data = {phoneNo, fName, lName, address, zipCode, city, email};
        getModel().addRow(data);
    
        if(sort)
        {
            sortTable();
        }
    
    }
    
    /**
     * Sortering af tabellen (den man ser) efter 0.kolonne. Sortere IKKE modellen.
     */
    private void sortTable()
    {
        TableRowSorter<TableModel> sorter = new TableRowSorter<TableModel>(getModel());
        List <RowSorter.SortKey> sortKeys = new ArrayList<RowSorter.SortKey>();
        sortKeys.add(new RowSorter.SortKey(0, SortOrder.ASCENDING));
        sorter.setSortKeys(sortKeys);
        customerTable.setRowSorter(sorter);
    }
    
    /**
     * Henter alle customers og gemmer dem i en midlertidig ArrayList. I denne ArrayList
     * tages hvert element og så hentes der TelefonNr, Fornavn, Efternavn, Adresse, PostNr, By og Email.
     * Derefter tilføjes disse til modellen og dermed til tabellen.
     */
    private void updateCustomerTable()
    {
        ArrayList<Customer> customers = customerCtr.getAllCustomers();

        String phoneNo = "";
        String fName= "";
        String lName = "";
        String address = "";
        String zipCode = "";
        String city = "";
        String email = "";
        
        
        
        for(Customer customerObj : customers)
        {   
            phoneNo = customerObj.getPhoneNo();
            fName = customerObj.getfName();
            lName = customerObj.getlName();
            address = customerObj.getAddress();
            zipCode = customerObj.getZipCode();
            city = customerObj.getCity();
            email = customerObj.getEmail();
            
            // Sortering foregår i databasen efter phoneNo, fName, lName, addres, city og email. derfor false.
            addRowAndData(phoneNo, fName, lName, address, zipCode, city, email, false);

        }
    } 
    
    /**
     * Sletter en række alt efter rækkenr i tabellen. Den konvertere først rækkenr
     * i tabellen til tilsvarende rækkenr i modellen da disse kan være forskellige
     * pga. at sorteringen foregår i tabellen og ikke i modellen. Derefter slettes
     * rækken i modellen og dermed i tabellen.
     * @param rowNo Rækkenr i tabellen som skal slettes. 
     */
    private void removeRow(int rowNo)
    {
        rowNo = customerTable.convertRowIndexToModel(rowNo);
        getModel().removeRow(rowNo);
    }
    
    /** This method is called from within the constructor to
     * initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is
     * always regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
        
  
    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
    private void initComponents() {

        jScrollPane1 = new javax.swing.JScrollPane();
        jTable1 = new javax.swing.JTable();
        createCustomerButton = new javax.swing.JButton();
        jScrollPane2 = new javax.swing.JScrollPane();
        customerTable = new javax.swing.JTable();
        deleteCustomerButton = new javax.swing.JButton();
        updateCustomerButton = new javax.swing.JButton();

        jTable1.setModel(new javax.swing.table.DefaultTableModel(
            new Object [][] {
                {null, null, null, null},
                {null, null, null, null},
                {null, null, null, null},
                {null, null, null, null}
            },
            new String [] {
                "Title 1", "Title 2", "Title 3", "Title 4"
            }
        ));
        jScrollPane1.setViewportView(jTable1);

        createCustomerButton.setText("Opret kunde");
        createCustomerButton.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                createCustomerButtonActionPerformed(evt);
            }
        });

        customerTable.setModel(new javax.swing.table.DefaultTableModel(
            new Object [][] {

            },
            new String [] {
                "Telefon nr.", "Fornavn", "Efternavn", "Adresse", "Post nr.", "By", "Email"
            }
        ) {
            Class[] types = new Class [] {
                java.lang.String.class, java.lang.String.class, java.lang.String.class, java.lang.String.class, java.lang.String.class, java.lang.String.class, java.lang.String.class
            };
            boolean[] canEdit = new boolean [] {
                false, false, false, false, false, false, false
            };

            public Class getColumnClass(int columnIndex) {
                return types [columnIndex];
            }

            public boolean isCellEditable(int rowIndex, int columnIndex) {
                return canEdit [columnIndex];
            }
        });
        customerTable.setSelectionMode(javax.swing.ListSelectionModel.SINGLE_SELECTION);
        customerTable.getTableHeader().setReorderingAllowed(false);
        jScrollPane2.setViewportView(customerTable);

        deleteCustomerButton.setText("Slet kunde");
        deleteCustomerButton.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                deleteCustomerButtonActionPerformed(evt);
            }
        });

        updateCustomerButton.setText("Opdater kunde");
        updateCustomerButton.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                updateCustomerButtonActionPerformed(evt);
            }
        });

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
        this.setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
                    .addGroup(layout.createSequentialGroup()
                        .addComponent(updateCustomerButton)
                        .addGap(18, 18, 18)
                        .addComponent(deleteCustomerButton))
                    .addGroup(javax.swing.GroupLayout.Alignment.LEADING, layout.createSequentialGroup()
                        .addComponent(createCustomerButton)
                        .addGap(18, 18, 18)
                        .addComponent(jScrollPane2, javax.swing.GroupLayout.DEFAULT_SIZE, 553, Short.MAX_VALUE)))
                .addContainerGap())
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(createCustomerButton)
                    .addComponent(jScrollPane2, javax.swing.GroupLayout.DEFAULT_SIZE, 324, Short.MAX_VALUE))
                .addGap(18, 18, 18)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(deleteCustomerButton)
                    .addComponent(updateCustomerButton))
                .addContainerGap())
        );
    }// </editor-fold>//GEN-END:initComponents
        
    /**
     * Her oprettes en customer ved hjælp af JOptionPane hvor der er 6 textfields,
     * hvor de forskellige data bliver indsat.
     * rc = 1. Oprettelsen gik godt i databasen.
     * rc -1. Fejl ved oprettelse i databasen. 
     */
    private void createCustomerButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_createCustomerButtonActionPerformed
        JTextField phoneNoField = new JTextField();
        JTextField fNameField = new JTextField();
        JTextField lNameField = new JTextField();
        JTextField addressField = new JTextField();
        JTextField zipCodeField = new JTextField();
        JTextField emailField = new JTextField();
        int rc =0;
        
        // Strings og JTexFields som skal vises i JOptionpane.
        Object[] message = new Object[] {"Fornavn:", fNameField, "Efternavn:", lNameField, "Adresse:", addressField, "Post nr.:", zipCodeField, "Email:", emailField, "Telefon nr.:", phoneNoField};
        
        
        // En anden form for JOptionpane.
        //int input = JOptionPane.showConfirmDialog(this, message, "Opret ny kunder", JOptionPane.OK_CANCEL_OPTION); HER er OK Knappen i fokus fra start!
        
        //Knapper på JOptionpane, som der har knapperne "OK" og "Annuller".
        Object[] options = {"OK", "Annuller"};
        
        int input = JOptionPane.showOptionDialog(this, message, "Opret ny kunde", JOptionPane.OK_CANCEL_OPTION, JOptionPane.INFORMATION_MESSAGE, null, options, "");
        
        if(input == JOptionPane.OK_OPTION)
        {
          try
          {
            int phone = Integer.parseInt(phoneNoField.getText()); 
            if (phoneNoField.getText().length() > 0 && phoneNoField.getText().length() < 13)
            {
                try
                {
                    rc = customerCtr.createCustomer(phoneNoField.getText(), fNameField.getText(), lNameField.getText(), addressField.getText(), zipCodeField.getText(), emailField.getText());
                }
                catch(Exception e)
                {
                }  
                //rc = return code
                if(rc == 1)
                {
                    String city = customerCtr.findCustomer(phoneNoField.getText()).getCity();
                    
                    addRowAndData( phoneNoField.getText(), fNameField.getText(), lNameField.getText(), addressField.getText(), zipCodeField.getText(), city, emailField.getText(), true);
                    JOptionPane.showMessageDialog(this, "Kunden "+ fNameField.getText()+ " " + lNameField.getText() + " er nu oprettet", "Oprettelse lykkedes", JOptionPane.INFORMATION_MESSAGE);
                    
                }
                else
                {
                    JOptionPane.showMessageDialog(this, "Der er opstået en fejl. Kunden" + fNameField.getText() + "" + lNameField.getText() + " eksisterer muligvis i forvejen.", "oprettelse mislykkedes", JOptionPane.ERROR_MESSAGE);
                }
            }
            else
            {
                JOptionPane.showMessageDialog(this, "Der er opstået en fejl. Tjek om du har indtastet noget forkert", "oprettelse mislykkedes", JOptionPane.ERROR_MESSAGE);
            }
        }
          catch(NumberFormatException e)
          {
              JOptionPane.showMessageDialog(this, "Der skal indtastes tal i telefon nummer", "oprettelse mislykkedes", JOptionPane.ERROR_MESSAGE);
          }
        }
    }//GEN-LAST:event_createCustomerButtonActionPerformed
    
    // room opdateres ved hjælp af den markerede række i tabellen hvor telefon nummet bruges til opdatering.
    // rc = 1. Opdatering gik godt i databasen.
    // rc = -1. Opdatering mislykkedes.
    private void updateCustomerButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_updateCustomerButtonActionPerformed
        int rowSelected = customerTable.getSelectedRow();
        int rc = 0;
        if(rowSelected == -1)
        {
            JOptionPane.showMessageDialog(this ,"vælg kunden som skal opdateres.", "Vælg medarbejderen", JOptionPane.INFORMATION_MESSAGE);
        }
        else
        {
            
            String phoneNo = (String) customerTable.getValueAt(rowSelected, 0);
            String fName = (String) customerTable.getValueAt(rowSelected, 1);
            String lName = (String) customerTable.getValueAt(rowSelected, 2);
            String address = (String) customerTable.getValueAt(rowSelected, 3);
            String zipCode = (String) customerTable.getValueAt(rowSelected, 4);
            String email = (String) customerTable.getValueAt(rowSelected, 6);
            JTextField fNameField = new JTextField(fName);
            JTextField lNameField = new JTextField(lName);
            JTextField addressField = new JTextField(address);
            JTextField zipCodeField = new JTextField(zipCode);
            JTextField emailField = new JTextField(email);
            
            
            
            
            Object[] message = new Object[] {"Telefon nr.:", phoneNo, "Fornavn:", fNameField, "Efternavn:", lNameField, "Adresse:", addressField, "Post nr.:", zipCodeField,"Email:", emailField};       
            Object[] options = { "Opdater", "Annuller"};
            
            //Bruges for at få fokus i det første textfield i JOptionpanet.
            int input = JOptionPane.showOptionDialog(this, message, "Opdatering af kunde", JOptionPane.OK_CANCEL_OPTION, JOptionPane.INFORMATION_MESSAGE, null, options, "");
            
            if(input == JOptionPane.OK_OPTION)
            {
                if(fNameField.getText().length() > 0)
                {
                   try
                   {
                    rc = customerCtr.updateCustomer(phoneNo, fNameField.getText(), lNameField.getText(), addressField.getText(), zipCodeField.getText(), emailField.getText());
                   }
                   catch(Exception e)
                   {
                   }
                   
                    if(rc == 1)
                    {
                        String city = customerCtr.findCustomer(phoneNo).getCity();
                        customerTable.setValueAt(phoneNo, rowSelected, 0);
                        customerTable.setValueAt(fNameField.getText(), rowSelected, 1);
                        customerTable.setValueAt(lNameField.getText(), rowSelected, 2);
                        customerTable.setValueAt(addressField.getText(), rowSelected, 3);
                        customerTable.setValueAt(zipCodeField.getText(), rowSelected, 4);
                        customerTable.setValueAt(city, rowSelected, 5);
                        customerTable.setValueAt(emailField.getText(), rowSelected, 6);
                        
                        JOptionPane.showMessageDialog(this, "Kunden er opdateret.", "Opdatering lykkedes", JOptionPane.INFORMATION_MESSAGE);  
                    }
                    else
                    {
                        JOptionPane.showMessageDialog(this, "fejl opstået", "Opdatering mislykkedes", JOptionPane.ERROR_MESSAGE);
                    }
                }
                else
                {
                    JOptionPane.showMessageDialog(this, "Der skal indtastet de rigtige data.", "Oprettelse mislykkedes", JOptionPane.ERROR_MESSAGE);
                }
            }
        
        }
        
    }//GEN-LAST:event_updateCustomerButtonActionPerformed
    // customer slettes ved hjælp af den markerede række i tabellen hvor telefon nummeret bruges til sletning.
    // rc = 1. Sletning gik godt i databasen.
    // rc = -1. Sletning mislykkedes.
    private void deleteCustomerButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_deleteCustomerButtonActionPerformed
        int rowSelected = customerTable.getSelectedRow();
        int rc = 0;
        
        if(rowSelected != -1)
        {
            String phoneNo = (String) customerTable.getValueAt(rowSelected, 0);
            String fName = (String) customerTable.getValueAt(rowSelected, 1);
            String lName = (String) customerTable.getValueAt(rowSelected, 2);
            int input = JOptionPane.showConfirmDialog(this, "er du sikker på at du vil slette denne kunde: " + fName + " " + lName + "?", "Bekræft sletning", JOptionPane.OK_CANCEL_OPTION, JOptionPane.WARNING_MESSAGE);
            if(input == JOptionPane.OK_OPTION)
            {
                try{
                rc = customerCtr.deleteCustomer(phoneNo);
                }catch(SQLException e){
                    
                }
                
                if(rc == 1)
                {
                    removeRow(rowSelected);
                    JOptionPane.showMessageDialog(this, "Kunden er nu slettet", "sletning lykkedes", JOptionPane.INFORMATION_MESSAGE);
                }
                else
                {
                    JOptionPane.showMessageDialog(this, "En fejl er opstået.", "Sletning mislykkedes", JOptionPane.ERROR_MESSAGE);
                }
            }
        }
        else
        {
            JOptionPane.showMessageDialog(this, "Vælg den kunde som skal slettes.", "Vælg kunde", JOptionPane.INFORMATION_MESSAGE);
        }
    }//GEN-LAST:event_deleteCustomerButtonActionPerformed

    // Variables declaration - do not modify//GEN-BEGIN:variables
    private javax.swing.JButton createCustomerButton;
    private javax.swing.JTable customerTable;
    private javax.swing.JButton deleteCustomerButton;
    private javax.swing.JScrollPane jScrollPane1;
    private javax.swing.JScrollPane jScrollPane2;
    private javax.swing.JTable jTable1;
    private javax.swing.JButton updateCustomerButton;
    // End of variables declaration//GEN-END:variables
}
